/**
 * @addtogroup bsc_led_server
 * bsc_led_server
 * @{
 */
/**
 * @file        bsc_led_server.h
 * @brief       XXXX
 * @note        XXXX
 * @author      tj(jie.tan@hopechart.com, 谈杰)
 * @date        2023/10/27
 * @version     1.0

 * @par         修改日志
 * <table>
 * <tr><th>Date         <th>Version     <th>Author      <th> Description
 * <tr><td>2023/10/27   <td>1.0         <td>谈杰       <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _BSC_LED_SERVER_H_
#define _BSC_LED_SERVER_H_

#include "ofc/ofc_types.h"

#ifdef __cplusplus
extern "C"
{
#endif

typedef enum TBsLedStateTag TBsLedState;
enum TBsLedStateTag
{
    kBsLedStateOff = 0,    ///< led灭
    kBsLedStateOn  = 1,    ///< led亮
};


typedef struct TBsLedServerTag TBsLedServer;

/**
 * led设置回调
 * @param *self：对象指针
 * @param led_index：指示灯数组索引
 * @param led_state: led状态，True为点亮，False为熄灭
 */
typedef void (*TBsLedDoSet)(TBsLedServer *self, Int32 led_index, TBsLedState led_state);

/**
 * 指示灯闪烁配置
 * @note: 1.常亮设置 led_on_time > 0; led_off_time == 0;
 * @note: 2.常灭设置 led_on_time == 0; led_off_time > 0;
 * @note: 3.非法设置 (led_on_time == 0 && led_off_time == 0) || (led_on_time < 0 || led_off_time < 0);
 */
typedef struct TBsLedBlinkCfgTag TBsLedBlinkCfg;
struct TBsLedBlinkCfgTag
{
    Int32       led_on_time;      ///< led点亮时间，单位：ms
    Int32       led_off_time;     ///< led熄灭时间，单位：ms
};

typedef struct TBsLedServerCfgTag TBsLedServerCfg;
struct TBsLedServerCfgTag
{
    const TBsLedBlinkCfg *led_blink_cfg_list;   ///< 指示灯闪烁配置数组指针
    UInt32          led_blink_cfg_count;  ///< 指示灯闪烁配置个数
    TBsLedDoSet     do_led_set;           ///< 指示灯设置回调，由外部提供
};

/// 指示灯对象
typedef struct TBsLedTag TBsLed;
struct TBsLedTag
{
    TBsLedState led_state;
    Int32       led_on_time;      ///< led点亮时间，单位：ms
    Int32       led_off_time;     ///< led熄灭时间，单位：ms
    Int32       led_change_tick;  ///< led状态切换时间点
};

/// 指示灯服务对象
struct TBsLedServerTag 
{
    TBsLed          *led_list;             ///< 指示灯数组指针
    UInt32          led_count;             ///< 指示灯个数
    TBsLedServerCfg *led_server_cfg;       ///< 指示灯配置
};

/**
 * 指示灯初始化
 * @param *self：指示灯服务对象
 * @param *led_list：指示灯数组指针，需要由用户提供静态数组，
 * @param led_count: 指示灯个数
 * @param led_server_cfg: 指示灯服务配置，静态
 * @return 0：设置成功
 *        <0：错误码
 */
Int32 TBsLedServerCreate(TBsLedServer *self, TBsLed *led_list, UInt32 led_count, const TBsLedServerCfg *led_server_cfg);

/**
 * 指示灯去初始化
 * @param *self：指示灯服务对象
 * @return
 */
void TBsLedServerDestory(TBsLedServer *self);

/**
 * 指示灯服务循环调度函数
 * @param *self：指示灯服务对象
 * @return
 */
void TBsLedServerRunOnce(TBsLedServer *self);

/**
 * 指示灯模式设置
 * @param *self：指示灯服务对象
 * @param led_index：指示灯数组索引
 * @param led_blink_cfg_index: 指示灯闪烁配置索引
 * @return 0：设置成功
 *        <0：错误码
 */
Int32 TBsLedServerSetLedMode(TBsLedServer *self, Int32 led_index, Int32 led_blink_cfg_index);


#ifdef __cplusplus
}  ///< extern "C"
#endif

#endif

